#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
//全局变量命名
int high,width;           //游戏画面尺度
int ball_x,ball_y;          //小球的位置
int ball_vx,ball_vy;        //小球的速度
int block_x,block_y;        //砖块位置
int pause;                //暂停功能
int level,len;          //杆的左端点位置及长度
int score;            //分数,小球速度

void gotoxy(int x,int y)
{
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD pos;
    pos.X=x;
    pos.Y=y;
    SetConsoleCursorPosition(handle,pos);
}

void HideCursor()          //隐藏光标
{
    CONSOLE_CURSOR_INFO cursor_info={1,0};//第二个值为0表示隐藏光标
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
}

void start()              //数据初始化
{
    high=18;
    width=30;

    ball_x=1;
    ball_y=1;
    ball_vx=1;
    ball_vy=1;

    block_x=0;
    block_y=width/2;

    level=1;  //杆的左端点位置
    len=10;     //杆长

    pause=0;        //暂停
    score=0;        //杆接中分数

    HideCursor();    //隐藏光标
}

void show()         //显示画面
{
    int i,j;

    gotoxy(0,0);//光标移动到原点位置，以下重画清屏

    for(i=0;i<=high;i++)
    {
        for(j=0;j<=width;j++)
        {
            if((i==ball_x)&&(j==ball_y))//输出小球
                printf("O");
            else if((j==block_y)&&(i==block_x))
                printf("B");            //输出砖块
            else if(j==width)            //输出右边界
                printf("|");
            else if(i==high)
                printf("-");            //输出下边界
            else if((i==high-1)&&(j>=level)&&(j<level+len)) //输出杆
                printf("*");
            else
                printf(" ");            //输出空格
        }
        printf("\n");
    }
    printf("接中次数：%d\n",score);
    Sleep(100);
}


void update_without_input() //与用户输入无关的
{
    //根据速度更新小球位置
        ball_x+=ball_vx;
        ball_y+=ball_vy;
    //碰到边界后改变速度方向,反弹
    if(ball_x==0)
        ball_vx=-ball_vx;
    if(ball_y==0 || ball_y==width-1)
        ball_vy=-ball_vy;
     //碰到杆时
    if(ball_x==high-2)
    {
        if((ball_y>=level) && (ball_y<=level+len))//如果在杆长范围内则反弹
        {
            ball_vx=-ball_vx;
            score++;
        }
        else
        {
            printf("Game Over!!!\n");
            exit(0);      //游戏结束
        }
    }
    //碰到砖块时
    if((ball_x==block_x)||(ball_y==block_y))
    {
        score++;
        printf("恭喜击中砖块！");
        block_x=rand()%(high-1);    //重新定义砖块位置
        block_y=rand()%width;
    }
}

void update_with_input()
{
    char input;

    if(kbhit())//当用户按键时执行
    {
        input=getch();
                //执行暂停和继续功能
        if(input==27)
        {
            if(pause==0)
                pause=1;
            else
                pause=0;
        }
                //杆的移动
        if(input=='d')
            level+=3;

        if(input=='a')
            level-=3;
    }
}

int main()
{
    start();
    while(1)
    {
        if(pause==0)//执行继续功能
        {
            show();
            update_without_input();
        }
         update_with_input();
    }
    return 0;
}